package com.zhu.instructions.math;

// instructions/math/LUSHR.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：lushr
 *
 * 操作数：无
 *
 * 功能：
 *  将栈顶的 long 值进行逻辑右移：value1 >>> value2
 *  高位补0，无符号右移
 *
 * 栈变化：
 *      ..., value1(long), value2(int) → ..., result(long)
 *
 * 示例：
 *  (-8L) >>> 1 = 9223372036854775804L
 *
 * 实现：
 *  使用 >>> 运算符对 long 进行无符号右移
 */
public class LUSHR extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        int v2 = stack.popInt();     // 位移量
        long v1 = stack.popLong();   // 被移动值

        int s = v2 & 0x3f;
        long result = v1 >>> s;      // 逻辑右移（无符号）
        stack.pushLong(result);
    }
}
